package models

import (
	"gorm.io/gorm"
	"time"
)

type Article struct {
	Model

	TagId int `json:"tag_id" validate:"required,gt=0" label:"标签id"`
	Tag   Tag `json:"tag" validate:"-"` // - 字段未设置则忽略

	Title      string `json:"title" validate:"required,min=2,max=100" label:"标题"`
	Desc       string `json:"desc" validate:"required,min=2,max=200" label:"描述"`
	Content    string `json:"content" validate:"required,min=2,max=65530" label:"内容"`
	CreatedBy  string `json:"created_by" validate:"required,min=2,max=20" label:"创建人"`
	ModifiedBy string `json:"modified_by" validate:"omitempty,min=2,max=20" label:"修改人"` // omitempty 字段未设置则忽略
	State      int    `json:"state" validate:"required,oneof=0 1" label:"状态"`
}

// 给CreatedOn赋值
func (a *Article) BeforeCreate(scope *gorm.DB) error {
	scope.Statement.SetColumn("CreatedOn", time.Now().Unix())

	return nil
}

// 给ModifiedOn 赋值
func (a *Article) BeforeUpdate(scope *gorm.DB) error {
	scope.Statement.SetColumn("ModifiedOn", time.Now().Unix())

	return nil
}

// ExistsArticleByID 判断文章是否存在
func ExistsArticleByID(id int) bool {
	var article Article
	db.Select("id").Where("id=?", id).First(&article)
	if article.ID > 0 {
		return true
	}
	return false
}

// GetArticleTotal 获取文章总记录数
func GetArticleTotal(whereMaps interface{}) (count int64) {
	db.Model(&Article{}).Where(whereMaps).Count(&count)

	return
}

// GetArticles 获取文章列表
func GetArticles(pageNum int, pageSize int, whereMaps interface{}) (articles []Article) {
	// 关联查询Tag标签数据
	db.Preload("Tag").Where(whereMaps).Offset(pageNum).Order("id desc").Limit(pageSize).Find(&articles)
	return
}

// GetArticle 获取单个文章
func GetArticle(id int) (article Article) {
	// 获取文章
	// db.Preload("Tag").Select("id,tag_id,title,`desc`,created_by").Where("id=?", id).First(&article)
	// preload 指定查询的字段：
	db.Preload("Tag", func(db *gorm.DB) *gorm.DB {
		return db.Select("id,name") // SELECT id,name FROM `blog_tag` WHERE `blog_tag`.`id` = 1
	}).Where("id=?", id).First(&article) // 无效
	// 获取文章关联的标签

	return
}

// EditArticle 编辑文章
func EditArticle(id int, data interface{}) bool {
	db.Model(&Article{}).Where("id=?", id).Updates(data)
	return true
}

// AddArticle 添加文章
func AddArticle(article Article) int {
	ret := db.Create(&article)
	if ret.Error != nil {
		return 0
	}

	return article.ID
}

// DeleteArticle 删除文章
func DeleteArticle(id int) bool {
	ret := db.Where("id=?", id).Limit(1).Delete(&Article{})
	if ret.RowsAffected == 0 {
		return false
	}
	return true
}
